package com.SpringBoot.test_1_27_springbootconfig;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Test127SpringBootConfigApplication {

    public static void main(String[] args) {
        SpringApplication.run(Test127SpringBootConfigApplication.class, args);

        // ***** SpringBoot 配置⽂件 ****
        // 配置文件 最重要的目的: 解决硬编码(代码写死)的问题

        // 1. 常见配置项 (使用)
        // 2. 配置文件的格式(重要)


        //SpringBoot 的配置文件, 有三种格式
        // 1. properties
        // 2. yaml
        // 3. yml (yaml的简写)   (2.3是一个)
        // 事实是: SpringBoot 只支持 3 个文件
        // application.properties
        // application.yaml
        // application.yml
        // 只要你换了个名字(重命名一个) SpringBoot 就不认了

        // 还有就是 如果项目中 同时存在 properties 和 yml 的配置文件的话, properties的优先级更高
        // 两个文件同时存在时, 两个文件都生效, 如果两个文件中都包含同一个配置项, 就以properties为主
        // 一般通常只是用一个文件,不会同时存在的


        // ****  properties 配置⽂件说明 ****
        // ****  properties 基本语法 ****
        // properties 是以键值的形式配置的，key 和 value 之间是以"="连接的，如：
        // # 配置项⽬端⼝号
        //server.port=8080
        //#配置数据库连接信息
        //spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&
        //spring.datasource.username=root
        //spring.datasource.password=root

        // key 的格式建议是小写, 单词之间使用 . 分割

        // 读取配置⽂件
        //如果在项⽬中，想要主动的读取配置⽂件中的内容，可以使⽤ @Value 注解来实现。
        //@Value 注解使⽤" ${} "的格式读取，如下代码所⽰：  $符号表示取变量里面的值, 如果去掉$,就会把""中的值赋值给当前变量
        //properties 配置如下:
        //

        // properties 的缺点
        // properties 配置是以 key-value 的形式配置的，
        //从上述配置key看出, properties 配置⽂件中会有很多的冗余的信息
        // 容易区分不出来

        //想要解决这个问题，就可以使⽤ yml 配置⽂件的格式化了

        // ****  yml 配置⽂件说明 ****
        // yml 是 YAML 是缩写，它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语⾔.

        // yml 基本语法
        // yml 是树形结构的配置⽂件，它的基础语法是"key: value".
        //key 和 value 之间使⽤英⽂冒号加空格的⽅式组成，空格不可省略

        // yml 就是把 properties 的 . 换成了 冒号 + 换行符
        // 且 key 后面用 冒号 空格 赋值
        // 而且前面不能有Tab键,而是 空格键

        // 之后如果想要继续在后面写别的 需要换行 从头 写
        // 如果换行错了 就表示 是一级的了

        // 获取方法也是跟 上面 properties 一样 用@Value 注解

        // **** yml 配置不同数据类型及 null ****
        // # 字符串
        //string.value: Hello
        //# 布尔值，true或false
        //boolean.value: true
        //boolean.value1: false
        //# 整数
        //int.value: 10
        //# 浮点数
        //float.value: 3.14159
        //# Null，~代表null
        //null.value: ~
        //# "" 空字符串
        //#, 直接后⾯什么都不加就可以了, 但这种⽅式不直观, 更多的表⽰是使⽤引号括起来
        //empty.value: ''


        // 单双引号的区别
        // 在配置文件中有 展示, YmlController
        // 单引号会对特殊字符进行转义
        // 双引号不会对特殊字符进行转义
        // 此处的转义 跟之前理解的相反
        // \n 本身表示换行, 使用单引号的时候, 内容表示成了 \n, 而不是换行, 所以认为了转义
        // 使用双引号的时候, \n表示成了换行, 也就是 \n 的本来含义, 所以就是没有转义

        // ****yml 配置对象****
        // 1.配置
        // student:
        //  id: 1
        //  name: Java
        //  age: 14
        // 2.配置内容读取
        // 3.注入

        // **** yml 配置 集合 ****
        // 配置⽂件也可以配置 list 集合
        // 在 - 后面 加上 空格

        // 1.配置
        // dbtypes:
        //  name:
        //    - mysql
        //    - sqlserver
        //    - db2
        // (-后面一定要有空格,不加的话就会被视为一个整体,一并赋值给属性name)
        // 2.配置内容获取
        // 获取方式 跟 获取对象的方式一样, 可以使用List接收,也可以使用 数组来接收
        // 3.注入

        // *** yml 配置map ***
        // 直接放入集合里面一块执行了
        // 配置
        //   map:
        //    k1: kk1
        //    k2: kk2
        //    k3: kk3

        // *** yml优缺点 ***
        // 优点:
        //1. 可读性⾼，写法简单, 易于理解 (因为有格式,带有一些换行)
        //2. ⽀持更多的数据类型, 可以简单表达对象, 数组, List，Map等数据形态
        //3. ⽀持更多的编程语⾔, 不⽌是Java中可以使⽤, 在Golang, Python, Ruby, JavaScript中也可以使⽤
        //缺点:
        //1. 不适合写复杂的配置⽂件
        //2. 对格式有较强的要求(⼀个空格可能会引起⼀场⾎案)


        // ***** 实现一个案例 *****
        // 验证码案例
        //  客户端和服务端都可以生成
        //  1. 生成内容, 根据词库取生成内容
        //  2. 生成干扰项
        //  3. 二者组成一个图片,返回
        // 验证:判断用户输入是否和生成的一致, 生成内容可以保存到Session 中




    }

}
